package doit20.sparksql

import org.apache.spark.sql.SparkSession

/**
 * @author 涛哥
 * @nick_name "deep as the sea"
 * @contact qq:657270652 wx:doit_edu
 * @site www.doitedu.cn
 * @date 2021-04-10
 * @desc sparksql整合hive示例
 */
object Demo8 {

  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder()
      .enableHiveSupport()  // 启用hive支持；同时，得加入你外部的hive的一些参数
      .appName("")
      .config("spark.sql.shuffle.partitions","10")
      .master("local")
      .getOrCreate()


    // writeTable(spark)
    readTable(spark)

  }

  /**
   * 读取表演示
   */
  def readTable(spark: SparkSession): Unit = {

    // 直接from res表，会报错，因为write table的时候，数据有保存在spark自己的仓库目录中，但元数据没有维护
    spark.sql("select * from res").show(100,false)

    spark.sql("show tables").show(100,false)

    spark.close()

  }


  /**
   * 保存表演示
   *
   * @param spark
   */
  def writeTable(spark: SparkSession): Unit = {

    import spark.implicits._
    val ds = spark.createDataset(Seq(
      (1, "a", 18),
      (2, "b", 28),
      (3, "c", 38)
    )).toDF("id", "name", "age")


    ds.createTempView("stu")

    val res = spark.sql(
      """
        |select
        |  id,name,age
        |from stu
        |where id < 5
        |""".stripMargin)


    // sparksql自己存储表时，会放到自己的数仓目录，由参数：spark.sql.warehouse.dir 来指定（默认是在程序运行目录下建 spark-warehouse）
    // 但是它不维护元数据（元数据直接放表数据文件parquet中）
    res.write.saveAsTable("res")

    spark.close()
  }



}
